#pragma once

#include <QPainter>
#include <QWidget>
#include "Const.h"

// 格
class Grid {
    public: bool mUsed; // 使用则为 true，否则为 false

    /**
     * 构造方法。
     */
    public: Grid() :
        mUsed(false) {
    }

    /**
     * 构造方法。
     * @param used  使用则为 true，否则为 false
     */
    public: Grid(bool used) :
        mUsed(used) {
    }
};

// 带颜色的格
class ColorGrid: public Grid {
    public: QColor mColor;  // 颜色
};

// 方块
class Block {
    // 形状
    protected: enum Shape {
        ONE,    // 形状1
        TWO,    // 形状2
        THREE,  // 形状3
        FOUR    // 形状4
    };

    protected: Grid mBlocks[Const::BLOCK_GRID_COUNT_V][Const::BLOCK_GRID_COUNT_H];  // 方块数据
    protected: QColor mColor;               // 颜色
    protected: QPainter mDrawer;            // 绘图者
    private: QWidget* mGameBoard;           // 游戏区域
    protected: QPixmap* mGameBoardBitmap;   // 游戏区域后台缓冲位图
    protected: int mLine;                   // 当前所在列（左）
    protected: int mRow;                    // 当前所在行（上）
    protected: Shape mShape;                // 形状
    private: static QPen sPenLeftTop1;      // 左边、上边框画笔（外框）
    private: static QPen sPenLeftTop2;      // 左边、上边框画笔（内框）
    private: static QPen sPenRightBottom1;  // 右边、下边框画笔（外框）
    private: static QPen sPenRightBottom2;  // 右边、下边框画笔（内框）

    public: Block();
    public: virtual ~Block() {}
    public: void draw();
    public: static void drawEdge(QPainter*, int, int);
    public: void enterGameBoard(QWidget*, QPixmap*);
    public: virtual void enterPreview(QPixmap*);
    protected: virtual void erase() = 0;
    protected: void eraseRect(QRect*);
    public: virtual int getBottom() = 0;
    public: virtual int getTop() = 0;
    protected: virtual void handleCannotMoveDown() = 0;
    public: virtual bool moveDown();
    public: virtual void moveLeft();
    public: virtual void moveRight();
    public: virtual void transform() = 0;
};
